package cfca.paperless.client.servlet._1_basic._1_05_SealAutoPdf;

import cfca.paperless.client.bean.SealUserInfo;
import cfca.paperless.client.bean.SignLocation;
import cfca.paperless.client.servlet.PaperlessClient;
import cfca.paperless.client.servlet.PaperlessConfig;
import cfca.paperless.client.util.IoUtil;
import cfca.paperless.client.util.PaperlessUtil;
import cfca.paperless.client.util.StrategyUtil;
import cfca.paperless.client.util.StringUtil;

/**
 * @Description Pdf自动化签章接口，使用示例。
 * 1，操作对象为服务端能够读取到的文件路径。
 * 2，使用服务端管理页面中预先制作的印章进行签章。
 * 3，签章类型支持4种，1=空白标签签章,2=坐标签章,3=关键字签章，4=位置标识。
 * 4，返回成功签章的PDF文件。
 * 
 * @Author dell
 * @Date 2016-5-13
 * @CodeReviewer TODO
 */
public class SealAutoPdfTest03 {

    public static void main(String[] args) throws Exception {

        long timeStart = System.currentTimeMillis();// 开始时间

        System.out.println("SealAutoPdfTest03 START");
        
        PaperlessClient clientBean = new PaperlessClient(PaperlessConfig.url, 10000, 60000);// 无纸化基本接口的访问URL

        // 服务端能够读取到的文件路径
        byte[] pdfFilePath = "D:/测试数据/PDF/模板-现金支取.pdf".getBytes("UTF-8");

        // 保存到临时PDF表中的pdfId，符合唯一约束（可以为空）pdfId值长度为 18-32位
        // 不为空时，则在服务端的临时PDF表[TEMP_FILE_PDF]中，指定表中字段PDF_ID为此值，保存PDF文件数据，只保留1个小时，超时则清除。
        // 为空时，则不会在服务端保存PDF文件数据。
        //String savedPdfId = GUID.generateId();
        String savedPdfId = "";
        System.out.println("临时PDF表保存的pdfId=" + savedPdfId);
        if(StringUtil.isNotEmpty(savedPdfId) && (savedPdfId.length() < 18 || savedPdfId.length() > 32)){
            throw new Exception("savedPdfId 的长度必须在18-32之间，否则pdf参数不被认为是临时ID");
        }
        
        // 印章编码和印章密码，需要在无纸化管理系统中添加此印章的信息，登录管理页面->选择电子印章管理->选择印章管理->添加印章信息（需要先添加相应的印模信息和印章证书信息）
        String sealCode = "yz2018031289230098";
        String sealPassword = "11111111";

        // 签章杂项信息
        // ************************************************************
        SealUserInfo sealUserInfo = new SealUserInfo("张三", "beijing", "reason");// 签章人，签章地点，签章理由
        
        //sealUserInfo.setFillOpacity(1.0f);// 透明度0-1.0f，默认为1.0f，可以为空
        //sealUserInfo.setVisible(true);// 是否显示，true or false，默认为true，可以为空
        
        //sealUserInfo.setBusinessCode("0123456789");// 业务码：可以是验证码、查询码，可以为空
        //sealUserInfo.setBusinessCodeStyle("font-size:9;x-ratio:0.1;y-ratio:0.7");// 业务码显示样式，可以为空
        
        // 设置印章显示大小，可以不设置。比如：100，代表100px。比如需要把章显示为4cm（圆章且DPI为96）时，传入151即可。（并且imageScale配置为0.87）
        //sealUserInfo.setSealImageSize(100);
        // ************************************************************

        // 签章类型（不能为空），1=空白标签签章,2=坐标签章,3=关键字签章，4=位置标识
        // ************************************************************
        // 1=按空白标签域签章
        //SignLocation signLocation = new SignLocation();
        //signLocation.setType("1");// 1=空白标签签章
        
        // 2=按坐标签章
        // 页数，按坐标签章时不能为空；
        // 左侧的x坐标（单位：像素）；左侧的y坐标（单位：像素）；
        //SignLocation signLocation = new SignLocation(1, 110, 10);
        
        // 3=按关键字签章
        // 关键字，按关键字签章时不能为空；
        // 位置风格：（上:U；下:D；左:L；右:R；中:C）；默认：C；
        // 横轴偏移，默认为0（单位：像素）；纵轴偏移，默认为0（单位：像素）
        SignLocation signLocation = new SignLocation("现金支取", "R", 10, 0);
        // 关键字位置索引（1：第一个位置；2：第二个位置；0：默认全部位置盖章，支持1、2、1-3、3-9格式，如果输入非法数字或者负数当做0处理，如果输入的数字大于关键字数量时就在最后一个位置盖章处理）
        //signLocation.setKeywordPositionIndex("1");
        
        // 4=按位置标识签章（需要提前在服务端管理页面上登录业务模板和签章位置标识信息）
        //SignLocation signLocation = new SignLocation("BizLoc001");// 签章位置标识编码
        // ************************************************************
        
        // 生成签章策略文件
        String sealStrategyXml = StrategyUtil.createSealStrategyXml(sealCode, sealPassword, sealUserInfo, signLocation);

        System.out.println(sealStrategyXml);
        
        // 操作员编码或者机构号
        String operatorCode = PaperlessConfig.operatorCode;
        // 渠道编码，可以为空
        String channelCode = PaperlessConfig.channelCode;
        
        // 获取时间戳的方式。默认值为0。0：实时访问CFCA 时间戳服务；1：使用从CFCA购置并在本地部署的时间戳服务器产品；
        String timestampChannel = "0";

        // 取得签章后的PDF文件数据
        byte[] sealedPdfData = clientBean.sealAutoPdf(pdfFilePath, savedPdfId, sealStrategyXml, operatorCode, channelCode, timestampChannel);

        String errorRsString = PaperlessUtil.isError(sealedPdfData);

        // 处理结果为正常，保存签章后的PDF文件到本地目录下
        if ("".equals(errorRsString)) {
            System.out.println("SealAutoPdfTest03 END OK");
            
            System.out.println(sealedPdfData.length);
            IoUtil.write("./TestData/output/SealAutoPdfTest03.pdf", sealedPdfData);
            
        } else {
            // 处理结果为异常，打印出错误码和错误信息
            System.out.println("SealAutoPdfTest03 END NG");
            System.out.println(new String(sealedPdfData, "UTF-8"));
        }
        
        
        long timeEnd = System.currentTimeMillis();// 结束时间
        System.out.println("##########" + "time used:" + (timeEnd - timeStart) + "##########");
    }

}
